﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using BLL.DataContextClasses;

namespace BLL.BusinessClasses
{
    public class UsuarioEgresado : BLL.BusinessClasses.UsuarioUniversitario
    {
        #region // Campos
        private List<Carrera> carreras;
        private List<Postgrado> postgrados; 
        #endregion

        #region // Propiedades        
        public List<Carrera> Carreras
        {
            get
            {
                if (this.carreras == null)
                {
                    this.carreras = Carrera.GetCarrerasByUsuarioEgresadoID(this.ID);
                }
                return this.carreras;
            }
            set { this.carreras = value; }
        }
        public List<Postgrado> Postgrados
        {
            get
            {
                if (this.postgrados == null)
                {
                    this.postgrados = Postgrado.GetPostgradosByEgresadoID(this.ID);
                }
                return this.postgrados;
            }
            set { this.postgrados = value; }
        }
        public override List<Aplicacion> Aplicaciones
        {
            get
            {
                if (this.aplicaciones == null)
                {
                    this.aplicaciones = Aplicacion.GetAplicacionesByEgresadoID(this.ID);
                }
                return this.aplicaciones;
            }
            set { this.aplicaciones = value; }
        }
        public override List<Contacto> Contactos
        {
            get
            {
                if (this.contactos == null)
                {
                    this.contactos = Contacto.GetContactosByEgresadoID(this.ID);
                }
                return this.contactos;
            }
            set { this.contactos = value; }
        }
        public override List<Habilidad> Habilidades
        {
            get
            {
                if (this.habilidades == null)
                {
                    this.habilidades = Habilidad.GetHabilidadesByEgresadoID(this.ID);
                }
                return this.habilidades;
            }
            set { this.habilidades = value; }
        }
        #endregion

        #region // Constructores
        public UsuarioEgresado(int IDToSearch)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Egresado Egr = (from e in DB.Egresados
                                                   where (e.ID == IDToSearch)
                                                   select e).First();

                this.id = Egr.ID;
                this.userName = Egr.Matricula + Egr.FechaNacimiento.Year.ToString();
                this.passWord = Egr.PassWord;
                this.matricula = Egr.Matricula;
                this.estado = Egr.Estado;
                this.primerNombre = Egr.PrimerNombre;
                this.segundoNombre = Egr.SegundoNombre;
                this.primerApellido = Egr.PrimerApellido;
                this.segundoApellido = Egr.SegundoApellido;
                //this.carrera = Egr.Carrera.Carrera.Descripcion;
                this.fechaNacimiento = Egr.FechaNacimiento;
                this.edad = ((DateTime.Now.Subtract(Egr.FechaNacimiento).Days) / 365);
                this.fechaPrimerIngreso = Egr.FechaPrimerIngreso;
                this.fechaUltimoIngreso = Egr.FechaUltimoIngreso;
                this.sexo = Egr.Sexo.ToString();
                this.experienciaLaboral = Egr.ExperienciaLaboral;
                this.detalleExperienciaLaboral = Egr.DetalleExperienciaLaboral;
                this.intereses = Egr.Intereses;
                this.siVehiculoPropio = Egr.SiVehiculoPropio;
                this.siBuscaTiempoCompleto = Egr.SiBuscaTiempoCompleto;
                this.foto = Egr.Foto;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal usuario\n" + SqlEx.Message);
            }
        }
        public UsuarioEgresado(string UserNameToLog, string PassWordToLog)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                DataContextClasses.Egresado Egr = (from e in DB.Egresados
                                                   where (e.Matricula + e.FechaNacimiento.Year.ToString() == UserNameToLog) && (e.PassWord == PassWordToLog)
                                                   select e).First();

                this.id = Egr.ID;
                this.userName = Egr.Matricula + Egr.FechaNacimiento.Year.ToString();
                this.passWord = Egr.PassWord;
                this.matricula = Egr.Matricula;
                this.estado = Egr.Estado;
                this.primerNombre = Egr.PrimerNombre;
                this.segundoNombre = Egr.SegundoNombre;
                this.primerApellido = Egr.PrimerApellido;
                this.segundoApellido = Egr.SegundoApellido;
                //this.carrera = Egr.Carrera.Descripcion;
                this.fechaNacimiento = Egr.FechaNacimiento;
                this.edad = ((DateTime.Now.Subtract(Egr.FechaNacimiento).Days) / 365);
                this.fechaPrimerIngreso = Egr.FechaPrimerIngreso;
                this.fechaUltimoIngreso = Egr.FechaUltimoIngreso;
                this.sexo = Egr.Sexo.ToString();
                this.experienciaLaboral = Egr.ExperienciaLaboral;
                this.detalleExperienciaLaboral = Egr.DetalleExperienciaLaboral;
                this.intereses = Egr.Intereses;
                this.siVehiculoPropio = Egr.SiVehiculoPropio;
                this.siBuscaTiempoCompleto = Egr.SiBuscaTiempoCompleto;
                this.foto = Egr.Foto;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal usuario o su username o password estan mal escritos\n" + SqlEx.Message);
            }
        } 
        #endregion

        #region // Metodos
        public void Insertar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();

            try
            {
                DataContextClasses.Egresado UsuarioEgrToInsert = new DataContextClasses.Egresado();

                UsuarioEgrToInsert.ID = this.id;
                //UsuarioEgrToInsert.Matricula = this.userName;
                UsuarioEgrToInsert.PassWord = this.passWord;
                UsuarioEgrToInsert.Matricula = this.matricula;
                UsuarioEgrToInsert.Estado = this.estado;
                UsuarioEgrToInsert.PrimerNombre = this.primerNombre;
                UsuarioEgrToInsert.SegundoNombre = this.segundoNombre;
                UsuarioEgrToInsert.PrimerApellido = this.primerApellido;
                UsuarioEgrToInsert.SegundoApellido = this.segundoApellido;
                //UsuarioEgrToInsert.ID_Carrera = this.Carrera.ID;
                //UsuarioEgrToInsert.ID_Carrera = Carrera.GetCarreraByUsuarioEgresadoID(this.id).ID;
                UsuarioEgrToInsert.FechaNacimiento = this.fechaNacimiento;
                UsuarioEgrToInsert.Sexo = this.sexo[0];
                UsuarioEgrToInsert.ExperienciaLaboral = this.experienciaLaboral;
                UsuarioEgrToInsert.DetalleExperienciaLaboral = this.detalleExperienciaLaboral;
                UsuarioEgrToInsert.Intereses = this.intereses;
                UsuarioEgrToInsert.SiVehiculoPropio = this.siVehiculoPropio;
                UsuarioEgrToInsert.SiBuscaTiempoCompleto = this.siBuscaTiempoCompleto;
                UsuarioEgrToInsert.Foto = this.foto;

                DB.Egresados.InsertOnSubmit(UsuarioEgrToInsert);

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la base de datos\n" + SqlEx.Message);
            }
        }
        public override void Actualizar()
        {
            DataClassesDataContext DB = new DataClassesDataContext();
            try
            {
                DataContextClasses.Egresado UsuarioEgr = (from e in DB.Egresados
                                                          where e.ID == this.id
                                                          select e).First();

                UsuarioEgr.ID = this.id;
                //UsuarioEgr.Matricula = this.userName;
                UsuarioEgr.PassWord = this.passWord;
                UsuarioEgr.Matricula = this.matricula;
                UsuarioEgr.Estado = this.estado;
                UsuarioEgr.PrimerNombre = this.primerNombre;
                UsuarioEgr.SegundoNombre = this.segundoNombre;
                UsuarioEgr.PrimerApellido = this.primerApellido;
                UsuarioEgr.SegundoNombre = this.segundoNombre;
                //UsuarioEgr.ID_Carrera = this.Carrera.ID;
                //UsuarioEgrToInsert.FechaNacimiento = this.fechaNacimiento;
                UsuarioEgr.FechaPrimerIngreso = this.fechaPrimerIngreso;
                UsuarioEgr.FechaUltimoIngreso = this.fechaUltimoIngreso;
                UsuarioEgr.Sexo = this.sexo[0];
                UsuarioEgr.ExperienciaLaboral = this.experienciaLaboral;
                UsuarioEgr.DetalleExperienciaLaboral = this.detalleExperienciaLaboral;
                UsuarioEgr.Intereses = this.intereses;
                UsuarioEgr.SiVehiculoPropio = this.siVehiculoPropio;
                UsuarioEgr.SiBuscaTiempoCompleto = this.siBuscaTiempoCompleto;
                UsuarioEgr.Foto = this.foto;

                DB.SubmitChanges();
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Hubo un problema con la base de datos\n" + SqlEx.Message);
            }
        }

        public override void AgregarHabilidad(int HabilidadID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                Egresados_Habilidade HabilidadToAdd = new Egresados_Habilidade();

                HabilidadToAdd.ID_Habilidad = HabilidadID;
                HabilidadToAdd.ID_Egresado = this.id;

                DB.Egresados_Habilidades.InsertOnSubmit(HabilidadToAdd);
                DB.SubmitChanges();

                this.habilidades = null;
            }
            catch (SqlException)
            {
                throw new Exception("Esta habilidad no se puede agregar, ya pertenece a este egresado");
            }
        }
        public override void EliminarHabilidad(int HabilidadID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();

                Egresados_Habilidade HabilidadToDelete = (from e_h in DB.Egresados_Habilidades
                                                          where e_h.ID_Habilidad == HabilidadID && e_h.ID_Egresado == this.id
                                                          select e_h).First();

                DB.Egresados_Habilidades.DeleteOnSubmit(HabilidadToDelete);
                DB.SubmitChanges();

                this.habilidades = null;
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("Error en la base de datos. Intente en unos minutos" + SqlEx.Message);
            }
        }

        public static UsuarioEgresado GetEgresadoByID(int IDToSearch)
        {
            try
            {
                return new UsuarioEgresado(IDToSearch);
            }
            catch (SqlException SqlEx)
            {
                throw new Exception("No existe tal usuario\n" + SqlEx.Message);
            }
        }
        public static List<UsuarioEgresado> GetEgresadosByCarreraID(int CarreraID)
        {
            try
            {
                DataClassesDataContext DB = new DataClassesDataContext();
                List<UsuarioEgresado> ListEgresadoToReturn = new List<UsuarioEgresado>();

                var QueryEgresados = from e in DB.Egresados
                                     where (from ec in DB.Egresados_Carreras
                                            where ec.ID_Egresado == e.ID && ec.ID_Carrera == CarreraID
                                            select ec).Count() > 0
                                     select e.ID;

                foreach (int EgresadoID in QueryEgresados)
                {
                    ListEgresadoToReturn.Add(new UsuarioEgresado(EgresadoID));
                }

                return ListEgresadoToReturn;
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un problema con la Base de datos\n" + ex.Message);
            }
        }

        #endregion
    }
}